home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / make / icmake-6.000 / icmake-6 / icmake / comp / catcode.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-08  |  2.0 KB  |  69 lines

  1. /*
  2.                                 C A T C O D E . C
  3. */
  4.  
  5. #include "iccomp.h"
  6.  
  7. static void patchadd ARG((register unsigned,
  8.                                    unsigned **, unsigned *,
  9.                                    unsigned *, unsigned));
  10.  
  11. static void patchadd(value, dest, dlen, source, slen)
  12.     register unsigned
  13.         value;
  14.     unsigned
  15.         *source,
  16.         **dest,
  17.         slen,
  18.         *dlen;
  19. {
  20.     register unsigned
  21.         index;
  22.  
  23.     if (!*dlen)
  24.         *dest = NULL;                       /* no memory for dest as yet */
  25.  
  26.     for (index = 0; index < slen; index++)  /* all elements of source list: */
  27.         source[index] += value;             /* icrement addresses of targets */
  28.  
  29.                                             /* expand the dest area */
  30.     *dest = xrealloc(*dest, (*dlen + slen) * sizeof(int));
  31.  
  32.                                             /* append source list */
  33.     memcpy(*dest + *dlen, source, slen * sizeof(int));
  34.     *dlen += slen;                          /* increment # element */
  35. }
  36.  
  37. ESTRUC_ *catcode(lval, rval)
  38.     ESTRUC_
  39.         *lval,
  40.         *rval;
  41. {
  42.     register unsigned
  43.         l,
  44.         r;
  45.  
  46.     r = rval->codelen;                      /* sizeof rval code */
  47.     l = lval->codelen;                      /* sizeof lval code */
  48.  
  49.     lval->code = xrealloc(lval->code,       /* room for new code */
  50.                           (l + r) * sizeof(INT8));
  51.  
  52.                                             /* catenate the code */
  53.     memcpy(lval->code + l, rval->code, r * sizeof(INT8));
  54.     lval->codelen += r;                     /* new size */
  55.  
  56.     patchadd(l, &lval->truelist, &lval->truelen,
  57.                 rval->truelist, rval->truelen);
  58.  
  59.     patchadd(l, &lval->falselist, &lval->falselen,
  60.                 rval->falselist, rval->falselen);
  61.  
  62.     lval->type |= rval->type;               /* type of combined code */
  63.                                             /* (is ok with same types) */
  64.  
  65.     discard(rval);                          /* free memory used by ESTRUC_ */
  66.  
  67.     return (lval);                          /* return new frame */
  68. }
  69.